\documentclass[a4paper,10pt]{article}
\usepackage[top=1.5cm, bottom=1.5cm, left=2cm, right=2cm]{geometry}

\usepackage{lmodern}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc} % Use 8-bit encoding that has 256 glyphs
\usepackage{microtype} % Slightly tweak font spacing for aesthetics

\usepackage{hyperref} % For hyperlinks in the PDF
\hypersetup{
  bookmarks=true,         % show bookmarks bar?
  unicode=false,          % non-Latin characters in Acrobat’s bookmarks
  pdfnewwindow=true,      % links in new window
  colorlinks=true,       % false: boxed links; true: colored links
  linkcolor=black,        % color of internal links (change box color with linkbordercolor)
  citecolor=magenta,        % color of links to bibliography
  filecolor=magenta,      % color of file links
  urlcolor=[rgb]{0,0,0.5}           % color of external links
}

\usepackage{multicol}
\usepackage{array}
\usepackage{lastpage}

\usepackage{fancyhdr} % Headers and footers
\pagestyle{fancy} % All pages have headers and footers
\fancyhead{} % Blank out the default header
\fancyfoot{} % Blank out the default footer
\fancyfoot[R]{\thepage/\pageref{LastPage}} % Custom footer text
\renewcommand{\headrulewidth}{0pt}

\setlength{\parindent}{0cm}
\usepackage{listings}
\usepackage{ragged2e}
\usepackage{pdfpages}
\usepackage{graphicx}
\graphicspath{ {./img/} }

\usepackage{minted} % coloration syntaxique

\usepackage{listingsutf8}
\lstdefinestyle{ShellStyle}{
  language=bash,
  breaklines=true,
  basicstyle=\footnotesize\ttfamily\color{black},
  % numbers=left,
  % numberstyle=\small,
  % numbersep=3pt,
  frame=tb,
  % columns=fullflexible,
  backgroundcolor=\color{yellow!20},
  linewidth=0.95\linewidth,
  xleftmargin=0.05\linewidth
}

\setcounter{tocdepth}{4}
%----------------------------------------------------------------------------------------
\let\olditemize\itemize
\renewcommand{\itemize}{
    \olditemize
\setlength{\itemsep}{0pt}
    \setlength{\parskip}{0pt}
    \setlength{\parsep}{0pt}
}
\renewcommand{\labelitemi}{$-$}
\renewcommand{\labelitemii}{$\ast$}

\begin{document}

\noindent
\begin{minipage}[t]{.45\textwidth}
    \raggedright
    Université de Provence\\
    Master 2 ISIC
\end{minipage}
\hfill
\vspace{1cm}

\centering
\huge{\textsc\textbf{Introduction au C++}}\\[1mm]
\noindent\hrulefill\\
\normalsize
\textit{Examen année 2010-2011}\\[3mm]
\justify
Durée: 1h00, Documents non autorisés\\
Calculatrices non autorisées

\noindent\hrulefill

\thispagestyle{fancy} % All pages have headers and footers

\large{\textsc{Lisez bien tout l'énoncé avant de commencer!}}
\normalsize

\section*{Question de cours (6 points)}
\addcontentsline{toc}{section}{Question de cours}

\begin{enumerate}
    \item Expliquez les notions d'encapsulation et d'héritage.
    \item Donnez le type de variable ainsi que ses qualificatifs pour chaque variable de la fonction \texttt{main} suivante :
\end{enumerate}
\begin{minted}[linenos=true,frame=single,fontsize=\scriptsize]{c++}
int main(void) {

    char varA[] = "filiere instrumentation";
    double varB = 2.;
    double const varC = varB;
    double* varD = &varC;
    double& varE = varB;
    double* const varF = &varC;
    double const* varG = varB;
    double const* const varH = varD;
    
    return 0;
}
\end{minted}

\section*{Surcharge (6 points)}
\addcontentsline{toc}{section}{Surcharge}

Soit la classe suivante :
\begin{minted}[linenos=true,frame=single,fontsize=\scriptsize]{c++}
#ifndef _VECTEUR3D_
#define _VECTEUR3D_

class Vecteur3D {
    private:
        float x, y, z;

    public:
        Vecteur3D(float c1=0.0, float c2=2.0, float c3=3.0)
        {
            x = c1;
            y = c2;
            z = c3;
        };
};
#endif
\end{minted}

\begin{enumerate}
    \item À quoi correspond la ligne 9 ?
    \item Définissez une fonction membre permettant d'afficher les coordonnées de notre vecteur.
    \item Rappelez la syntaxe générale our surcharger un opérateur quelconque.
    \item Surchargez l'opérateur \texttt{==} afin de permettre de tester si 2 objets de type \textit{vecteur3d} sont égaux. Ici la notion d'égalité signifie que si 2 vecteurs sont égaux, alors leurs coordonnées sont identiques.
    \item Supposons que je déclare une variable \textit{vecteur} de type \textit{vecteur3d}. Est-ce que je peux utiliser directement l'opérateur \texttt{<<} pour afficher les coordonnées de mon vecteur ? Pourquoi ?
    \item Surchargez l'opérateur \texttt{<<} via une fonction globale afin de permettre d'utiliser la syntaxe suivante :
\end{enumerate}

\begin{minted}[linenos=true,frame=single,fontsize=\scriptsize]{c++}
vecteur3d vecteur;
cout << vecteur;
\end{minted}

Rappels :
\begin{itemize}
    \item le ``et'' logique s'écrit avec l'opérateur \texttt{\&\&}
    \item le flux de sortie standard \texttt{cout} est un objet de type \textit{ostream}
\end{itemize}

\section*{UML et l'Héritage (10 points)}
\addcontentsline{toc}{section}{UML et l'Héritage}

\begin{figure}[h!]
  \centering
  \includegraphics[scale=0.25,angle=-90]{diagramme-de-classes.pdf}
  \caption{Diagramme UML associé à l'exercice C}
  \label{fig:diagramme-de-classes}
\end{figure}

Cet exercice se base sur la figure \ref{fig:diagramme-de-classes}. Dans ce schéma, la notation dite, notation UML est utilisée pour représenter les liens existant entre plusieurs classes. Cette notation utilise les conventions suivantes :\\[2mm]
Chaque classe sera écrite dans un rectangle divisé en 2 sections.
\begin{itemize}
    \item le nom de la classe dans la section du haut.
    \item chaque fonction membre de la classe sera écrite dans la section du bas précédée d'un :
        \begin{itemize}
            \item $+$ s'il s'agit d'un membre public
            \item $-$ s'il s'agit d'un membre privé
            \item $\#$ s'il s'agit d'un membre protégé
        \end{itemize}
    \item si une classe B dérive d'une classe A, alors les rectangles associés à A et B sont reliés par une flèche partant de B et allant vers A.
    \item si une classe B est une donnée membre d'une classe A, alors les rectangles associés à A et B sont au même niveau et sont reliés par un trait terminé par un rectangle partant de B et allant vers A.
\end{itemize}

\vspace{1cm}

\underline{\textsc{Questions :}}\\
Je me place maintenant dans la fonction \texttt{main} et je décide de créer 5 variables de la façon suivante :

\begin{minted}[linenos=true,frame=single,fontsize=\scriptsize]{c++}
int main(void)
{
    classe1 varClasse1;
    classe2 varClasse2;
    classe3 varClasse3;
    classe4 varClasse4;
    classe5 varClasse5;
    
    return 0;
}
\end{minted}

\begin{enumerate}
    \item Est-ce que je peux utiliser la fonction membre \texttt{affichage} depuis une variable de type \texttt{classe1} ? et \texttt{classe3} ?\\
        Justifiez.
    \item Qu'en est-il pour la fonction membre \texttt{modif} ?
    \item Écrivez la déclaration minimale pour nos 5 classes en supposant que chaque classe n'a qu'un constructeur par défaut.
    \item En supposant que dans la définition de chaque constructeur par défaut il y a une ligne permettant d'afficher l'endroit où  l'on se trouve (voir exemple).\\
        Écrire ce qui apparaîtra à l'écran lorsque les variables \texttt{varClass2} et \texttt{varClass4} sont déclarées.\\
        Exemple pour la classe 1 :
\begin{minted}[linenos=true,frame=single,fontsize=\scriptsize]{c++}
std::cout << "Constructeur associe a la classe1" << std::endl;
\end{minted}

\item Même question dans le cadre des destructeurs.
\item Supposons que la classe \texttt{classe1} possède 2 données membres protégées de type \texttt{double}. Je décide donc de créer un constructeur permettant l'utilisation de valeurs par défaut en paramètre. Est-ce suffisant ou alors est-ce que je dois aussi créer un constructeur par défaut ? Justifiez. Si cela n'est pas possible pour la classe \texttt{classe1}, y a-t-il une autre classe où cette alternative est possible ?
\end{enumerate}

\end{document}
